from scapy.all import Ether, Raw, sendp
import argparse
import time

# 配置
SRC_MAC = "08:00:00:00:01:11"  # h1 的 MAC
DST_SR_MAC = "01:00:5e:00:00:02"  # 源路由组播 MAC
INTERFACE = "eth0"  # 发送接口，已修改为 eth0

# 源路由头格式（匹配 P4 定义）
SR_HEADER = bytes([
    0x00,  # current_index = 0
    0x03,  # path_len = 3（s1→s5→s4）
    0x04,  # port0 = 4（s1-p4）
    0x02,  # port1 = 2（s5-p2）
    0x02,  # port2 = 2（s4-p2）
    0x00   # port3 = 0（未使用）
])

def send_sr_packets(count=5, interval=1):
    """发送源路由包，触发多模态转换"""
    print(f"发送 {count} 个源路由包到 {DST_SR_MAC}，接口: {INTERFACE}")
    
    for i in range(count):
        # 构建源路由包
        packet = (
            Ether(dst=DST_SR_MAC, src=SRC_MAC, type=0x1234) /  # TYPE_SR
            Raw(load=SR_HEADER) / 
            Raw(load="Hello, SR Multicast!")
        )
        sendp(packet, iface=INTERFACE, verbose=0)
        print(f"已发送 SR 包 #{i+1}")
        time.sleep(interval)

def main():
    parser = argparse.ArgumentParser(description="P4 多模态测试发包工具")
    parser.add_argument("-c", "--count", type=int, default=5, help="发包数量")
    parser.add_argument("-i", "--interval", type=float, default=1, help="发包间隔（秒）")
    args = parser.parse_args()
    
    send_sr_packets(count=args.count, interval=args.interval)

if __name__ == "__main__":
    main()